package com.example.predicate;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @Author 刘武贵
 * @Date 2024-03-05 22:49
 * @Description 功能描述：自定义断言功能
 * 实现自定义断言时，需要新建类继承org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory类
 */
@Component
/**
 * NameRoutePredicateFactory类，继承自AbstractRoutePredicateFactory，用于创建名称路由断言。并覆写相关的方法
 */
public class NameRoutePredicateFactory extends AbstractRoutePredicateFactory<NameRoutePredicateConfig> {

    /**
     * 构造函数，初始化NameRoutePredicateFactory。
     */
    public NameRoutePredicateFactory() {
        super(NameRoutePredicateConfig.class);
    }

    /**
     * 根据配置应用路由断言。
     *
     * @param config 名称路由断言的配置信息。
     * @return 返回一个Predicate，用于判断服务器web交换是否满足配置的名称条件。
     */
    @Override
    public Predicate<ServerWebExchange> apply(NameRoutePredicateConfig config) {
        return (serverWebExchange)->{
            // 从请求中获取名为"name"的查询参数
            String name = serverWebExchange.getRequest().getQueryParams().getFirst("name");
            // 如果查询参数"name"为空，则将其设置为空字符串
            if (StringUtils.isEmpty(name)){
                name = "";
            }
            // 判断当前请求的"name"参数是否与配置中的"name"相等
            return name.equals(config.getName());
        };
    }

    /**
     * 简捷字段顺序配置，指定断言配置中的字段顺序。
     *
     * @return 返回一个字段顺序列表。
     */
    @Override
    public List<String> shortcutFieldOrder() {
        // 指定字段顺序为"name"
        return Arrays.asList("name");
    }
}
